/*
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.Message;
import javax.mail.MessagingException;
import log.ExpertoLog;
import org.xml.sax.SAXException;
import java.util.regex.*;

/**
 *
 * @author Leandro
 */
public class ExpertoProcesamientoMensajes {
    
    private String listaBlancaFile;


    public List<DtoMensaje> processMessages(List<Mensaje> msjs){

        List<DtoMensaje> rta=new ArrayList<DtoMensaje>();
        List<DtoVariables> rtaVar = null;
        DtoVariables auxVar;
        String from = null;
        String content;
        DtoMensaje dtoMAux;
        Pattern patron=Pattern.compile(">(\\d{2}/\\d{2}/\\d{4}/\\d{2}:\\d{2});(\\d*(.\\d*)?);(\\d*(.\\d*)?);(\\d*(.\\d*)?);(\\d*(.\\d*)?);(\\d*(.\\d*)?)<");
        Matcher m;

        //Buscar la lista blanca en el archivo xml

        //Por cada mail
        for(int i=0;i<msjs.size();i++){
            auxVar=null;
            from = msjs.get(i).getFrom();
            //Verifica el remitente
            if(verificarRte(from)){
                content = msjs.get(i).getContent();
                m=patron.matcher(content);
                //Si valida la expresion regular
                if(m.find()){
                    rtaVar=new ArrayList<DtoVariables>();
                    //Leer el contenido y separarlo en variables
                    //Para cada variable
                    //Meter en var el valor de la variable
                    //Meter en nombreVar el nombre de la variable
                    //Creamos el nuevo DTO
                    auxVar=new DtoVariables("TimeStamp", m.group(1));
                    rtaVar.add(auxVar);
                    auxVar=new DtoVariables("Temperatura", m.group(2));
                    rtaVar.add(auxVar);
                    auxVar=new DtoVariables("Tension", m.group(4));
                    rtaVar.add(auxVar);
                    auxVar=new DtoVariables("Corriente", m.group(6));
                    rtaVar.add(auxVar);
                    auxVar=new DtoVariables("Potencia", m.group(8));
                    rtaVar.add(auxVar);
                    auxVar=new DtoVariables("Presion", m.group(10));
                    rtaVar.add(auxVar);
                    dtoMAux=new DtoMensaje(from, rtaVar);
                    rta.add(dtoMAux);
                }else{
                    ExpertoLog.logger.debug("Trama que no concuerda con el patron "+content+" recibida de "+from);
                }
                
            }else{
                ExpertoLog.logger.debug("Remitente no válido: "+from);
            }
        }
        return rta;
    }
      
//    Metodo viejo
//    public List<DtoMensaje> processMessages(List<Mensaje> msjs){
//
//        List<DtoMensaje> rta=new ArrayList<DtoMensaje>();
//        List<DtoVariables> rtaVar;
//        String from = null;
//        String content;
//        DtoMensaje dtoMAux;
//
//        //Buscar la lista blanca en el archivo xml
//
//        //Por cada mail
//        for(int i=0;i<msjs.size();i++){
//            content = msjs.get(i).getContent();
//            if(content.charAt(0)=='>' && content.charAt(content.length()-1)=='<'){
//           rtaVar=new ArrayList<DtoVariables>();
//                //Verificar el remitente
//            from = msjs.get(i).getFrom();
//
//            if(verificarRte(from)){
//
//                    //Leer el contenido
////                    content = msjs.get(i).getContent();
////               if(content.charAt(0)=='>' && content.charAt(content.length()-1)=='<'){
//                    char aux,aux2;
//                    int contadorCampos=0;
//                    DtoVariables auxVar;
//                    String var="",nombreVar="";
//
//                    //Procesarlo y separar las variables
//                    for(int j=0;j<content.length();j++){
//                        aux=content.charAt(j);
//                        if(aux=='>' || aux==';'){
//                            //Es delimitador de comienzo de variable
//                            int k=j+1;
//                            do{
//                                aux2=content.charAt(k);
//                                if(aux2!='>' && aux2!=';' && aux2!='<'){
//                                    var=var+(char)aux2;
//                                }
//                                k++;
//                            }while(aux2!=';' && aux2!='<');
//                            switch(contadorCampos){
//                                case 0:
//                                    nombreVar="TimeStap";
//                                    contadorCampos=1;
//                                    break;
//                                case 1:
//                                    nombreVar="Temperatura";
//                                    contadorCampos=2;
//                                    break;
//                                case 2:
//                                    nombreVar="Tensión";
//                                    contadorCampos=3;
//                                    break;
//                                case 3:
//                                    nombreVar="Corriente";
//                                    contadorCampos=4;
//                                    break;
//                                case 4:
//                                    nombreVar="Potencia";
//                                    contadorCampos=5;
//                                    break;
//                                case 5:
//                                    nombreVar="Presion";
//                                    contadorCampos=6;
//                                    break;
//                            }
//                            auxVar=new DtoVariables(nombreVar, var);
//                            rtaVar.add(auxVar);
//                            var="";
//                        }
//                    }
//                    if(contadorCampos==6){
//                          dtoMAux=new DtoMensaje(from, rtaVar);
//                            rta.add(dtoMAux);
//                    }else{
//                        ExpertoLog.logger.debug("#Trama con cantidad de campos erronea proveniente de "+from);
//                    }
//
//            }else{
//                SuscriptorLog.getInst().notificar("#Remitente: "+from+" fuera de la lista blanca");
//                ExpertoLog.logger.debug("#Remitente: "+from+" fuera de la lista blanca");
//            }
//
//            }else{
//                //Trama no valida
//                 ExpertoLog.logger.debug("#Trama no válida recibida de"+from);
//            }
//        }
//        return rta;
//    }

    public String getListaBlancaFile() {
        return listaBlancaFile;
    }

    public void setListaBlancaFile(String listaBlancaFile) {
        this.listaBlancaFile = listaBlancaFile;
    }

    private boolean verificarRte(String from) {
        List<String> listaBlanca=obenterRemitentes();
        boolean rta=false;
        for(String blancos:listaBlanca){
            if(from.equals(blancos)){
                rta=true;
            }
        }
        return rta;
    }

    private List<String> obenterRemitentes() {
        List<String> rta=new ArrayList<String>();
        
       // rta.add("1@mail.com");
        //rta.add("2@mail.com");
        ExpertoXml Exml;
        try {
            Exml = new ExpertoXml();
            rta= Exml.leerlistablanca("listablanca.xml");
        } catch (IOException ex) {
            Logger.getLogger(ExpertoProcesamientoMensajes.class.getName()).log(Level.SEVERE, null, ex);
            ExpertoLog.logger.error("#Excepcion de IO leyendo la lista blanca del XML",ex);
        } catch (SAXException ex) {
            Logger.getLogger(ExpertoProcesamientoMensajes.class.getName()).log(Level.SEVERE, null, ex);
            ExpertoLog.logger.error("#Excepcion de SAX leyendo la lista blanca del XML",ex);
        }
        
        return rta;
    }


}
